I know that the C# lock statement is pre-compiled to...
No, you don't know that, because that is false. First, because that is no longer the code generated for locks and has not been since 2009, and second, because the C# specification does not say that a compiler is required to generate that code and compile it. It says that the compiler is required to generate code that is semantically equivalent to the given code.
My question is, if I were to write code using these syntactic sugars, how can I see what the generated C# code is?
I wrote much of the semantic analyzer that does those transformations. There is no such "generated" code. The compiler does not work on the level of text by the time the semantic analysis pass is running. It works on internal data structures that represent the code, and it transforms those.
Is there a "precompilation" process that first converts these syntactic sugars to the more complicated C# code, and then it gets compiled into CIL?
Not at the level you're interested in, no.
How can I see what C# "syntactic sugar" is really doing behind the scenes?
Get the Roslyn source code from github and carefully examine anything that has the word "lowering" in it. That's where the magic you are interested in happens. ("Lowering" means going from a high-level construct like a nullable integer addition and rewriting it into a series of low-level manipulations, like calls to HasValue, and so on.) I might suggest that you particularly look at nullable arithmetic lowering, user-defined conversion lowering and LINQ expression lowering, as these lowering passes have a number of interesting problems to solve.
You might also be interested in an article I wrote on a related topic: http://ericlippert.com/2014/04/28/lowering-in-language-design-part-one/