One of the important features of .NET is that it eliminates “DLL hell” - the problems that can crop up when you replace one version of a library with another version that claims to be compatible, but really isn’t. For example, if a program was written to work around undocumented bugs in version 1, and version 2 fixes those bugs, the program might stop working after an upgrade, even though the public specifications of the new version are the same. The creators of the DLL might not even know they’re breaking third party software with the upgrade.
So .NET allows programs to be linked against specific versions of libraries, and it allows multiple versions to coexist on your computer. It wastes some space, but disk space is cheap these days.
This is also good for security, because libraries can be signed by their creators, and that signature is part of the version information that’s in a program. If you have a .NET program that’s linked with version 1.0 of System.Web.dll (signed by Microsoft), a malicious hacker can’t just create his own System.Web.dll, call it version 1.0, and slip it onto your computer, because he doesn’t have Microsoft’s private key to forge their signature. If he replaces your legitimate copy of the DLL with his own, the program won’t even run, because .NET won’t be able to find the library it’s linked to.
You only need to install the version(s) that the applications you use were built with.