C# Multi level HTML TagBuilder object - Design pattern Review needed
I would make sure the list is not exposed publicly - the caller can then do whatever they want with that list, even assign null to it.  So I've refactored it a little bit and implemented Add() (you may also want to implement Remove(), etc.):

/// &lt;summary&gt;
/// Simple class that inherits TagBuilder and allow to save sub tags.
/// &lt;/summary&gt;
public class MultiLevelHtmlTag : TagBuilder
{
    /// &lt;summary&gt;
    /// List of inner tags.
    /// &lt;/summary&gt;
    private readonly IList&lt;MultiLevelHtmlTag&gt; innerTags = new List&lt;MultiLevelHtmlTag&gt;();

    /// &lt;summary&gt;
    /// Initializes a new instance of the &lt;see cref="MultiLevelHtmlTag"/&gt; class.
    /// &lt;/summary&gt;
    /// &lt;param name="tagName"&gt;The name of the tag.&lt;/param&gt;
    public MultiLevelHtmlTag(string tagName) : base(tagName)
    {
    }

    /// &lt;summary&gt;
    /// Gets the inner tag list.
    /// &lt;/summary&gt;
    /// &lt;value&gt;The inner tag list.&lt;/value&gt;
    public IEnumerable&lt;MultiLevelHtmlTag&gt; InnerTags
    {
        get
        {
            return new ReadOnlyCollection&lt;MultiLevelHtmlTag&gt;(this.innerTags);
        }
    }

    /// &lt;summary&gt;
    /// Adds the specified tag to the inner tag list.
    /// &lt;/summary&gt;
    /// &lt;param name="tag"&gt;The tag to add.&lt;/param&gt;
    public void Add(MultiLevelHtmlTag tag)
    {
        if (tag == null)
        {
            throw new ArgumentNullException("tag");
        }

        this.innerTags.Add(tag);
    }

    /// &lt;summary&gt;
    /// Returns a &lt;see cref="System.String"/&gt; that represents this instance.
    /// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// A &lt;see cref="System.String"/&gt; that represents this instance.
    /// &lt;/returns&gt;
    public override string ToString()
    {
        var sb = new StringBuilder();

        foreach (var tag in this.innerTags)
        {
            sb.Append(tag.ToString());
        }

        this.InnerHtml = sb.ToString();
        return base.ToString();
    }
}