But another question is, why does it have to be that way? Was it based on technical limitations of having too many blocks if there was 1 per minute or 1 per second?
It's to allow for high latency between nodes. If it was one minute, a few seconds of latency between ends of the network could give someone with good network resources a better chance of winning blocks, damaging the "one vote per CPU" principle.
Also, remember that a confirmation is valuable because it represents some CPU power. If it took a minute on average to get a confirmation, you'd have to get 10 confirmations to match the protection of a single 10-minute confirmation. 1-minute confirmations might even be
less valuable than 0 confirmations in such a system because it could be cheaper for an attacker to solve the required number of blocks than to overcome the TCP network.
Perhaps the one vote per CPU principle is wrong. Network speed is a hugely valuable part of the system. I want those finding blocks to have fast connections. I need to really put effort into understanding how someone could double-spend to really understand the problem well, though.
But perhaps it's better to think about BitCoin as a "between-bank" system for larger transfers done less often, rather than down to the individual. You of course could do it down to the individual for transactions that may take a while and you don't care (which actually is a lot of them, any time someone writes a check, it's pretty much the same thing). A separate solution would be needed for more instant purchases, which may be fine, but if you end up with 50 different implementations, it starts to look more like the current system, transaction fees will creep back in, etc... But maybe that's ok.