I'm sure that, as with Java, there will always be people using code that is specific to a given version of the runtime environment. (*) So, nope, I don't think that, in general, you'll be able to run a software written for .NET version X in .NET version Y if X is not equal to Y. Most, well-written, software will work but some braindead ones won't. (Unless I'm very wrong and M$ was wiser in developing later versions of .NET than Sun was with Java... somehow, I doubt that.

But DirectX does seems to be downward compatible: when, in the early days of DirectX 3-5 or something, I had a problem with a game and manually uninstalled the latest DirectX and reinstalled the previous one, the game still didn't run and it turned out that rather the video card driver was not recent enough.)
(*) I think it was a workmate of mine who told me recently that, by a very wise move, IBM is now using Java-based installers for their software. However, their installers are so... khm... heterogeneous... that there are, actually, several different versions of the Java runtime environment embedded into the installer package so that all fragments of the Java code can run error free. Yes, that's right, they did not find and rewrite the specific code... Yippee!