After many long years of development to both MS Windows platforms and Linux platforms and especially lots of frustration in recent days trying to install/uninstall software on my WinXP to solve a problem I have few conclusions on proprietary vs. open source development.
One of the nice things about development in Microsoft world (or at least seems so until you get into trouble) is that everything wraps up so nicely as if you were in a candy store. There are very nice tools for development and there sophisticated mechanisms for code reuse such as DLLs and libraries as well as well documented APIs and examples. Microsoft as a sole owner of the MS Windows platform has created a complete eco-system of dev tools to enable you as a developer to rapidly develop your own applications. One simple MS-Windows application usually relies on many, many dependencies such as other products installed/service packs/specific operating systems/DLLs and actually when you wrap your application as a setup package you usually rely on these to exist in the target computer and to be (hopefully) compliant with your specific application requirements. To package all dependencies into your application is not relevant and some do package unique extensions that are required but most just deliver their own app relying on Microsoft to handle dependencies.
This mechanism works very nice in a controlled environment world where you fully control the setup of your test machines but once you go into the wild where the variety of combinations of configurations are enormous, things usually break. Especially after few install/uninstalls of few apps where each one leaves its trails of broken dependencies. Actually as I see it a MS-Windows PC that has received a normal "dosage" of installs/uninstalls becomes actually chaotic in terms of what is actually residing in it. Here the lack of awareness to what your application actually needs and depends on works to your worst.
On Linux/Open Source world when you develop you usually know what you are depending on and the approach is more minimalistic in terms of depending on too many components to already reside on the target computer unless it is a specific runtime platform like perl or python. This approach makes your dev/packaging process seem at first more "dirty" and requires hands-on experience but the end result is a way more stable deployment then what you could achieve in MS World. Usually install/uninstall of software on Linux does not affect the rest of the system and the instructions on how to make your software work can become very clear. This is attributed to the way Linux and open source in general has been developed by different independent minds who found an effective integration approach unlike MS "integrative" one.
I am not sure whether it is MS goal to achieve perfect automatic/transparent platform but still eventually the more hand-on approach seem to work better. This opens up some thoughts on APP store like approaches for iPhone for example where there a similar simplistic approach to handle deployment automatically is being taken. Currently in the App store frontier with the low amount of software packages and low complexity of available apps nowadays the problem does not seem to exist but still time will tell how it will deal with complexity similar to MS variety.
That is also why people like web apps a lot where no "apparent" setup happens though this environment goes also through changes that make it "stickier" to te target platform such as Google Gears and native code implementations. Actually within browsers the setup happens on demand and new code deployment happens automatically where dependencies are minor since the browser separates automatically dependencies between domains.