Serializar el miembro del diccionario <cadena, cadena> a elementos y datos XML

Tengo una clase de 'productos' que es serializable a XML. Estoy usando el estándar System.Xml.Serialization.XmlSerializer para serializar y un objeto 'escritor' XmlWriter para escribir los resultados serializados en un objeto StreamWriter. El objeto serializador ahora serializa toda la clase de una vez:

XmlSerializer serializer = new XmlSerializer(typeof(products));
serializer.Serialize(writer, products);

La clase tiene un miembro Dictionary <string, string> llamado 'Especificaciones'. Está construido dinámicamente, por lo que no conozco las claves de antemano. Aquí hay un ejemplo de qué datos puede contener el diccionario (clave: valor):

color azullongitud: 110 mmancho: 55 mm

Me gustaría poder serializar esa propiedad en esto:

...
<specifications>
  <color>blue</color>
  <length>110mm</length>
  <width>55mm</width>
</specifications>
...

Sé que este es un diseño XML deficiente, pero debe cumplir con una especificación de terceros.

¿Hay quizás un atributo estándar que pueda usar? Si no, ¿cómo podría serializar el diccionario así?

Si necesita más fragmentos de código, avíseme.

EDITAR: Debido a algunos cambios en los requisitos, dejé ir el Diccionario <string, string>. En cambio, creé una clase "Especificación":

public class Specification
{
    public string Name;
    public string Value;
    public bool IsOther;

    public Specification() : this(null, null, false) { }

    public Specification(string name, string value) : this(name, value, false) { }

    public Specification(string name, string value, bool isOther)
    {
        Name = name;
        Value = value;
        IsOther = isOther;
    }
}

Para evitar repetir el elemento "spec" al tener una Lista de "Especificaciones" en la clase de producto, utilizo una clase plural de "Especificaciones" que implementa la interfaz IXmlSerializable:

public class Specifications: IXmlSerializable
{
    public List<Specification> Specs = new List<Specification>();

    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        //I don't need deserialization, but it would be simple enough now.
        throw new System.NotImplementedException();
    }

    public void WriteXml(XmlWriter writer)
    {
        //write all "standarad", named specs
        //this writes the <color>blue</color>-like elements
        Specs.Where(s => !s.IsOther).ToList().ForEach(s => writer.WriteElementString(s.Name, s.Value));

        //write other specs
        //this writes <other_specs>{name|value[;]}*</other_specs>
        string otherSpecs = string.Join(";", Specs.Where(s => s.IsOther).Select(s => string.Concat(s.Name, "|", s.Value)));
        if (otherSpecs.Length > 0) writer.WriteElementString("other_specs", otherSpecs);
    }
}

La clase "Especificaciones" se aplica como:

public class Product
{
    public Product()
    {
        Specifications = new Specifications();
    }

    [XmlElement("specs")]
    public Specifications Specifications;

    //this "feature" will not include <specs/> when there are none
    [XmlIgnore]
    public bool SpecificationsSpecified { get { return Specifications.Specs.Any(); } }

    //...
}

Gracias por proporcionar ejemplos de IXmlSerializable y XmlWriter. No conocía esa interfaz y el uso de XmlWriter, ¡resultó ser una inspiración valiosa para mí!

* Esta fue mi primera pregunta SO. ¿Cuál es la forma más adecuada de cerrarlo? No proporcioné esto como mi propia respuesta, ya que no es una respuesta real a mi pregunta inicial (sobre el Diccionario).

Respuestas a la pregunta(2)

Su respuesta a la pregunta