Cleaning up Compiler class
Just some generic notes since I'm not too familiar with C#:


rtn should be StringBuilder
I'd change the preprocessor and ParserRounds variables to fields and pass their values to the constructor of the class. It makes testing easier (you can test only one parser at a time, you can test with a mocked preprocessor etc.) and it results looser coupling.
Using SourceTemplate.Top and SourceTemplate.Bottom also tight coupling, pass these values to the constructor too, store them in a field and use these fields in the Compile method. (Maybe it's worth creating a SourceTemplate interface with GetTop() and GetBottom() methods and passing a proper instance to the Compiler class.)
I'm really missing the input validation. For example, if the Compile method get a null as a value of TextReader you should throw an exception immediately. It helps debugging a lot. Why would you do any compiling if it will throw an exception later since the TextReader is null?

The Start method also should check the input values.
Some variable naming ideas:


src -> sourceReader or srcReader
com -> compiler
target -> targetFileName
rtn -> result
wsrc -> targetWriter