String.Replace() is going to be horribly inefficient, you'll have to call it for each possible Cyrillic letter you'd want to replace. Use a Dictionary instead (no pun intended). For example:
private const string Cyrillic = "AaБбВвГг...";
private const string Latin = "A|a|B|b|V|v|G|g|...";
private Dictionary<char, string> mLookup;
public string Romanize(string russian) {
if (mLookup == null) {
mLookup = new Dictionary<char, string>();
var replace = Latin.Split('|');
for (int ix = 0; ix < Cyrillic.Length; ++ix) {
mLookup.Add(Cyrillic[ix], replace[ix]);
}
}
var buf = new StringBuilder(russian.Length);
foreach (char ch in russian) {
if (mLookup.ContainsKey(ch)) buf.Append(mLookup[ch]);
else buf.Append(ch);
}
return buf.ToString();
}
Note how the bars and the Split() function are necessary in the Latin replacement because some Cyrillic letters require more than one letter for their transliteration. Key idea is to use a dictionary for fast lookup and a string builder for fast string construction.
This United Nations document might be helpful.