The illumina platform uses a so called sequencing by synthesis process. Bases are added one at a time and the consensus is determined in a cluster of identical sequences.
The source of errors can be numerous, here is one review that discusses the issues in more detail:
In a nuthsell a short answer to the best of my understanding is this: Not all sequences in a cluster will grow at the same rate, this will slowly lead to a desynchronization as the errors accumulate. This is why the quality dips towards the end.
See this post: