To take a step in that direction, I'm am switching from Process.Start to using the MSBuild APIs directly. It took a while to figure out a way that works, but now I've got one:
Loading Gist 7519022
This requires a custom logger to gather the output, which I wrote like this:
Loading Gist 7519004
This new logger is pretty specialized - high importance messages only. I have an urge to generalize it to let the importance be a parameter, but for now, I'm applying YAGNI and leaving it as simple as I can.