It's because most programming efforts are built on top of a predetermined stack. If that stack isn't a great fit for whatever reason, then your only alternative is to make another layer that is a better fit, even if that same level of abstraction exists lower in the stack.
Of course, you don't want to do that for every project, so there gets to be one common open source layer to serve that purpose. So now lots of people like the new layer and use it, and then it becomes prescribed for other developers. Then it's not a perfect fit for all those developers, and they start writing another layer to change it again. GOTO 10.
Another thing that happens is if you are used to working at layer N, then layer N-2 is really scary low level stuff. It's much more comfortable to write layer N+1 rather than step down to N-2. Even if N-2 is actually a lot simpler if you just lose the fear and try it.
Of course, you don't want to do that for every project, so there gets to be one common open source layer to serve that purpose. So now lots of people like the new layer and use it, and then it becomes prescribed for other developers. Then it's not a perfect fit for all those developers, and they start writing another layer to change it again. GOTO 10.
Another thing that happens is if you are used to working at layer N, then layer N-2 is really scary low level stuff. It's much more comfortable to write layer N+1 rather than step down to N-2. Even if N-2 is actually a lot simpler if you just lose the fear and try it.