While Hans Passant is correct in everything he says he misses a key point which is the role of the PE header in this debacle.
Because Dotnet 4.5 is an in-place install over the top of Dotnet 4.0, and because it doesn't update the Dotnet version number, the result is that binaries built using Dotnet 4.5 have the old Dotnet 4.0 version number in their binary's PE header (4.0.30319).
Because the CLR uses this value in the PE header to determine which version of the Dotnet Framework to load, and because this value doesn't change for assemblies built against Dotnet 4.5, then in the absence of any additional information the CLR has no way of knowing whether an assembly with 4.0.30319 in the PE header requires linking to Dotnet 4.0 or 4.5.
It's the presence of the supportedRuntime element in app.config that provides this extra information to the CLR. So if you launch a Dotnet 4.5 application with the supportedRuntime entry present on a system that only has Dotnet 4.0 installed, then the CLR will pop up a helpful message informing you that you don't have the required version of Dotnet installed. Whereas if you launch the same Dotnet 4.5 application without the supportedRuntime entry on a system that only has Dotnet 4.0 installed, then the application may start to run, but then crash when it later tries to use a Dotnet 4.5 feature.
While projects built using VS2012 RC and targeting Dotnet 4.5 might have had the supportedRuntime entry missing, projects built using VS2012 RTM do have the entry.