In addition to all the other reasons mentioned here, another idea: managers don't know how to use programmer talent very efficiently. Of all the things programmers are told to do, 90+% of them are useless or worse than useless, in that they simply make long-term maintenance worse without adding value.
If you cannot use a resource efficiently at all, wasting most of it, then it is not surprising that you end up with a shortage. When faced with this situation, management can: 1) admit that they are the problem, and get much better at allocating programmer effort wisely, a task that will be very difficult even once it's well understood (which it currently isn't). Or... 2) hire more programmers, paying whatever is required to get more