That's almost it, yes. There are some very minor changes around locking and events, but usually those won't be noticeable. For the event changes, see Chris Burrows' blog series; for locking see Eric Lippert's blog. In short, locking is now more reliable - it uses a new overload of Monitor.Enter
so that it can detect whether the lock was acquired even in the face of asynchronous exceptions. Field-like events are now lock-free, and referring to a field-like event accessor (add/remove) in the declaring class will refer to the event rather than the field.
It's definitely a smaller set of changes than 2 and 3, but I think that's a good thing in many ways - I think devs need a certain amount of time for the current features to "bed in". Both 2 and 3 were really big feature releases... and some of those features still aren't really widely understood, IMO.
I'm sure that won't be the end of C#'s evolution - I've got some ideas, so I bet the C# team has rather more - but there's only so much that can be packed into one release. Although I suspect most developers won't actually use dynamic typing very often, it's a huge change in terms of the language itself, IMO - a very complex thing to get right. I'm not surprised the team didn't have much time to create many more features in the same release cycle.
Don't forget there was VS2010 to work on too, integrating all the new features into that and working on the pretty significant changes to Visual Studio itself.
One thing that's worth mentioning is that although covariance and contravariance are definitely CLR features - and indeed have been since CLR v2.0 - they're still language and library features, just like generics and nullable value types spanned CLR, framework and language.