Because the copy dialog is just guessing. It can’t predict the future, but it is forced to try. And at the very beginning of the copy, when there is very little history to go by, the prediction can be really bad.
Here’s an analogy: Suppose somebody tells you, “I am going to count to 100, and you need to give continuous estimates as to when I will be done.” They start out, “one, two, three…”. You notice they are going at about one number per second, so you estimate 100 seconds. Uh-oh, now they’re slowing down. “Four… … … five… … …” Now you have to change your estimate to maybe 200 seconds. Now they speed up: “six-seven-eight-nine” You have to update your estimate again.
Now somebody who is listening only to your estimates and not the the person counting thinks you are off your rocker. Your estimate went from 100 seconds to 200 seconds to 50 seconds; what’s your problem? Why can’t you give a good estimate?
File copying is the same thing. The shell knows how many files and how many bytes are going to be copied, but it doesn’t know know how fast the hard drive or network or internet is going to be, so it just has to guess. If the copy throughput changes, the estimate needs to change to take the new transfer rate into account.