I find .NET confusing when comes to packaging - Assemblies, netmodules, gacs, etc. Something written in the same way might be a package, or object. Also tons of methods, for which you have to rely on IDE that guides you all the time. I consider this a bit of bad thing - all it means is that I can really only think of what could be done in front of the IDE - by discovering functions by their names that sound like the task I want to accomplish.
Then moving from 2.0 or other version to newer, comes with surpires - the guy that previously coded something left his assemblies that he downloaded from whoknows where, and these are no longer supported, or there is no x64 version, and they were somehow 32 bit only.
I'm not sure what language you're used to, but the .NET package system isn't that hard to work with.
Assemblies: think JAR files, Python eggs, Ruby gems. They're collection of classes, which can be grouped into modules.
Modules: a collection of classes. 99% of the time, there is one module in an assembly. Modules are effectively invisible for developers in all contexts; they really come up when you combine a pile of existing assemblies into one big master assembly for distribution, in which case that master assembly will have multiple modules, but as a developer, the main way that this would show up is that the things that were previously their own assemblies still act as if they're all in separate assemblies.
The GAC: This is what it sounds like: the global assembly cache. It allows multiple programs to safely use the same DLL, so that you only need to have one copy on your machine.
I've not actually heard of people getting totally lost in the .NET 2 to 4 transition, but I'm sure it's happened. That said, that's also happened in the Go world (especially due to their lack of versioning), in the Python world (especially as 2 to 3 starts actually happening), in the Java world (where someone didn't specify full versions for what JARs they were using, and the new ones conflict), and a bunch of other environments. I don't consider that .NET-specific.
It's funny how you managed to make a powerful feature sound like a flaw. Just forget "tons of methods" exist and code your implementations then. In a Notepad.