Возможно, вы могли бы просто использовать StringBuilder.Replace()
.
StringBuilder cString = new StringBuilder("Bloke %s drank %5.2f litres of booze and ate %d bananas");
cString.Replace("%s","{0}");
cString.Replace("%5.2f", "1,5:f2"); // I am unsure of this format specifier
cString.Replace("%d", "{2}");
string newString = String.Format(cString.ToString(), var1, var2, var3);
Возможно, вы могли бы добавить что-то вроде этого в качестве метода расширения для String, но я думаю, что вашей самой большой проблемой будут специально отформатированные спецификаторы,Если это нетривиально в этом аспекте, вам может понадобиться разработать регулярное выражение, чтобы поймать их и выполнить замену осмысленно.