An alternative title could have been "why unsponsored open source never work" but since sponsored open source sometimes don't work very well either, I didn't want to exclude sponsored open source from this post.
Over the years I've had to work with a number of open source projects. Both sponsored and unsponsored. With sponsored I mean a project where there is a company driving the development and making sure the project progresses and produce good results. An unsponsored project is when a number of volunteers drive the development of the project. I guess most open source projects are unsponsored as in there is no company making business decisions on what features to support.
And that is usually where everything goes wrong in my humble opinion. Because there are is no business involved the most advanced features and the most complex bugs almost never get fixed because if you're developing in your spare time you will concentrate on the fun stuff, not the boring obscure bugs someone has filed. And this is the experience I have from several projects (where wxWidgets and geeklog are is just two examples). A well documented and used-by-many open source projects usually covers about 99% of my needs. And I've often chosen the open source because it really adds value and is easy to use. But always, always there is this last percent it does not cover.
And this is when I run into trouble because the last percent of functionality I need, and that isn't in there, I discover quite late and there is no way I can defend the decision to change the decision so I'm stuck with what I got. And now I have to start working around the missing functionality or I have to rethink my solution so that I do not need that last percent of functionality. Neither option is very appealing to me since both include a lot of work and the reason for using the open source in the first place is to save me some time.
OK so now we all hopefully agree that almost all open source projects have missing functionality (or bugs) that you need fixed in order to continue working. So why don't I just fix the things I need in the open source and contribute it back to the open source community? Well first of all I have contributed fixes to various open source communities. I'm glad to do that whenever possible but most of the time I'm unable to do that. The reason I'm unable to contribute back is that it would take me more time to understand how the open source project works internally than it takes me to work around the problem. Remember that I typically use open source in order to reduce how much I have to work. So when I have to work around some missing functionality, I want to do it as quickly as possible. And most open source projects I've been in contact with have been pretty hard to get familiar with when I start looking at internal stuff of the project. A nice clean, well documented interface sometimes covers something that takes lots of time to understand.
Preemptive comment: So how much open source does Microsoft use internally? Well I don't know. Each use of open source in each project have to be cleared by lawyers and since that takes time I guess developers at Microsoft tend to not use open source very much.