Clean up the .NET Framework BCL
The .NET framework has been around for a long time. During that time, many mistakes have been made and lessons have been learned. If features like async, generics and extension methods were around from the start, surely many parts of the .NET framework would have been written differently.
I don't know exactly how this would work (have some kind of compatibility shim for older assemblies?), but the current situation is getting unwieldy. There have to be mechanisms in place to be able to "fix" mistakes effectively so they don't just continue to pile up over 15 years.
This is far from an exhaustive list but here are a few areas that could really benefit from a spring cleaning:
C5 should really be used as a template for how to properly implement collections in .NET but sadly I don't think it will ever happen. Ideally if the license is suitable for it it, C5 should just be forked and rolled right into the the framework but that's a discussion for a different suggestion.
Right now collections are a mess...ReadOnlyCollection<T> can't wrap an ICollection<T>, it only takes an IList<T> (shouldn't it be IReadOnlyList<T>??). There are many more examples of the term "Collection" just being thrown around all willy nilly. IList doesn't inherit IReadOnlyList. Linq checks for IList when it can optimize the operation with an index instead of IReadOnlyList. ICollection only has a Count but ICollection<T> can also add/remove/clear items. There are naming inconsistencies all over the place. The namespaces sometimes don't make sense. It's honestly getting a little silly and I don't understand how half this stuff ever passed a basic code-review.
There needs to be a more coherent strategy in place for something as fundamental as collections. Please just clean up the whole collections situation, starting with a thorough code-review on naming everything in a sensible way.
Anything that is the "old way" of doing things should be HIDDEN (not just marked obsolete) to "promote" the improved way of doing things while cleaning up intellisense and documentation (add an expandable section of obsolete things that is hidden by default). That includes most non-generic collections, async methods that used the old BeginXXX / EndXXX way of coding, etc.
If commonly used/required classes would have been written differently with generics and async support then do it and hide the old methods or use some compability shimming method to translate accordingly.
OTHER AREAS OF INCONSISTENCIES:
Take this opportunity to knock off any and all "I wish we did things this way" items off the list. I think every 10 years or so is a good length of time to do a thorough review of how things evolved so that bad decisions don't propogate forever.