Kirk was right. Here's the code if anyone wants it.
IDynamicGlyph createMultiGlyph(String imagePathName, String text, int fontSize, System.Drawing.FontStyle fontstyle = System.Drawing.FontStyle.Bold, String fontType = "Arial")
{
IMultiLayerMarkerSymbol multiLayerMarkerSymbol = new MultiLayerMarkerSymbolClass();
pictureMarkerSymbol = new PictureMarkerSymbolClass();
pictureMarkerSymbol.CreateMarkerSymbolFromFile(esriIPictureType.esriIPictureBitmap, imagePathName);
pictureMarkerSymbol.Size = 100;
IColor whiteTransparencyColor = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToRGBColor(Color.FromArgb(255, 255, 255)) as IColor;
pictureMarkerSymbol.BitmapTransparencyColor = whiteTransparencyColor;
multiLayerMarkerSymbol.AddLayer(pictureMarkerSymbol);
List<int> asciiList = stringToAscii(text);
int pixelsBetweenLetters = 2;
int numLetters = text.Length;
int widthOfAllSpaces = (numLetters -1) * pixelsBetweenLetters;
int adjustmentMultiplier = 3; //TextRenderer.MeasureText is not perfect
int width = 0;
for (int i = 0; i < text.Length; i++)
{
SizeF size = TextRenderer.MeasureText(text[i].ToString(), new Font(fontType, fontSize, fontstyle));
width = ((width + Convert.ToInt32(size.Width)) / adjustmentMultiplier);
}
int negativeXoffset = -1 * ((width + widthOfAllSpaces) / 2);
int currentOffset = negativeXoffset;
for (int i = 0; i < asciiList.Count; i++)
{
ICharacterMarkerSymbol characterMarkerSymbol = new CharacterMarkerSymbolClass();
Font arialFont = new Font(fontType, fontSize, fontstyle);
characterMarkerSymbol.Font = ESRI.ArcGIS.ADF.Connection.Local.Converter.ToStdFont(arialFont);
characterMarkerSymbol.Size = fontSize;
characterMarkerSymbol.Color = SymbolCreator.getColor(255, 0, 0) as IColor;
characterMarkerSymbol.XOffset = currentOffset;
characterMarkerSymbol.CharacterIndex = asciiList[i];
multiLayerMarkerSymbol.AddLayer(characterMarkerSymbol);
SizeF size = TextRenderer.MeasureText(text[i].ToString(), new Font(fontType, fontSize));
currentOffset += Convert.ToInt32(size.Width / adjustmentMultiplier) + pixelsBetweenLetters;
}
IDynamicGlyph returnGlyph = dynamicGlyphFactory.CreateDynamicGlyph((ISymbol)multiLayerMarkerSymbol);
return returnGlyph;
}
public List<int> stringToAscii(String stringToConvert)
{
List<int> asciiList = new List<int>();
for (int i = 0; i < stringToConvert.Length; i++)
{
char c = stringToConvert[i];
byte b = (byte)c;
asciiList.Add(b);
}
return asciiList;
}