Esta es un área difícil. Necesita el objeto Selection y DOM Range. Sin embargo, IE hace esto completamente diferente a los navegadores adecuados.
Envolver la selección dentro de las etiquetas tampoco es trivial en general: debe tener en cuenta todos los nodos de texto dentro de la selección.
Mi biblioteca Rangy normaliza la API de selección/rango para IE y tiene un module to apply a CSS class to a selection, lo que puede ayudarlo hasta cierto punto. También estoy planeando escribir un módulo más general para aplicar otros estilos a una selección/rango.
Perdón por la descarada autopromoción, pero sin escribir mucho código usted mismo, no sé qué más sugerir.
Muchas gracias por su respuesta, tengo que aprender más manipulación de cadenas de JavaScript. – Zebra