I'm not aware of an inbuilt solution for this. Normally such a thing would be done by the IME as Griff says.
You probably need to create a lookup table, which is logically a two-dimensional map and which you probably would implement as Dictionary<char, Dictionary<char,char>>. Populate it in a static constructor like so:
Dictionary<char, Dictionary<char,char>> lookupTable = new Dictionary<char, Dictionary<char,char>>;
static MyClass(){
lookupTable['a'] = new Dictionary<char,char>();
lookupTable['a']['"'] = 'ä';
lookupTable['a']['o'] = 'å';
I'm not sure if there is even a standard set of diacritical marks from the ASCII set, and there's not much point using the ones in Unicode since if the user can enter those, they can enter the character they want directly. Those you need for ANSI (Western Europe) are grave (è), acute (é), umlaut (ä), circumflex (â), ring (å), slash (ø), caron (š), tilde (ñ) and cedila (ç); sensible characters to use to mark them would be `, ', ", ^, o, v, ~ and c. In the ANSI set there are also eth and thorn, which are not really diacritics of a normal character; oe and ae diphthongs; and the German ß, to think about.