I'm sorry, but a language for which a fully-compliant compiler takes a decade to write is horribly broken.
(Computer) languages should not inspire "puzzle books". Too often I'll see colleagues scratching their heads wondering why a piece of code works a certain way, or why something doesn't work the way it's supposed to.
Languages are a tool to get things done. The more time you spend lost in the entrails of a language, the more you're wasting your time.
I don't think C++ would give you a good grounding for a language like C#; too much emphasis on manual memory allocation, and insufficient exposure to higher-level abstractions, like lambdas and monads (as IEnumerable<T> effectively is).
It all depends on the type of C++ you are writing. It is such a vast language that usage patterns can range anywhere from C90 plus declare-where-used and single line comments to something that in practice isn't a whole lot different than C#. Modern C# includes RAII-like idioms with using statements and IDisposable replacing C++'s destructors, and C++ manages to fake garbage collection using smart pointers.
It's not an ideal basis but there are worse languages to learn before coming to C#; it might even be easier for C++ programmers to move to C# and begin working comfortably than Java programmers.
Maybe. Manual memory allocation is no longer a best practice for "normal" C++ projects, and I'm not sure how much easier C#'s syntax for higher-level abstractions is relative to template metaprogramming. Both are convoluted, obviously.