As I understand the current design models the compiler as a set of programs that act on specific source files.
A better granularity could be achieved if you look at these programs on their own: They are processors
which transform an input file into an output file. There are different types of processors
(e.g. RC compilers, CPP compilers, ScannerGenerators, ParserGenerators ...)
A set of processor instances could be seen as a compiler suite.
Every compiler installation comes with their own set of preferred processors. But possibly one or more of the processors are missing (Most compiler installations do not have Lex/Yacc or a documentation tool like DoxyGen). In this case you need a kind of fallback mechanism which selects the tool from a global pool.
Within a project you normally have a two step transformation (compiling, linking). One could think about further steps (e.g. deployment, documentation) but I think that such steps are better hosted within dedicated projects.
BTW: the developers of the SharpDevelop project have made their design document "Dissecting a C# Application: Inside SharpDevelop" available for free. See
http://www.icsharpcode.net/OpenSource/SD/InsideSharpDevelop.aspxI think its a valuable source for ideas related to building an IDE.