JSON serializer using generics rather than System.Object
Nice try, however there are potential optimization and code quality improvements.

First obvious thing is handling of the trailing comma.

If you try to generalize your code for the other possible underlying string output component (Stream, for example), you would discover that a string editing operation is not readilly available. Not all the streams support positioning, for example.
In a good implementation, i would not expect the trailing comma at all:

Following is a pseudocode with an abstracted Append method.

using (var iterator = items.GetEnumerator())
{
    if (iterator.MoveNext())
        Append(json, iterator.Current);
    while (iterator.MoveNext())
    {
        Append(json, ',');
        Append(json, iterator.Current);
    }
}


In this code, json could be a StringBuilder or a Stream, or whatever your implementation would use.

Using formatting is a performance killer.

Append format creates at least one excess array object on heap (as for the current implementation of NET 4.5), and parses the format string, which is suboptimal.
If you want your code to be performant, use just the append method of the string builder:

json.Append('[').Append(value).Append(']');


Following part makes feeling like i would never rely on such an implementation:

if (json.Length &gt; 11)


It's a bad way of checking for an empty collection and a bad usage of magic constant in your code. Solve the former, and get rid of the latter.

Using reflection is another performance killer.
There are many techniques to do all the reflection on a type beforehand, and then use a compiled delegate. You can find information on Expression.Compile, which uses Assembly.Emit to generate code dynamically at runtime only the first time a particular type serialization is used.

I would say code comments inside methods lead to unmaintainable code, and the comments like:

// iterate through the IEnumerable


..

if (value == null)// make sure value is not null or empty


..

json.Append("},");// add another row in the array (another dictionary)


...are pretty much useless.

Just assume that every person reading your code knows that foreach means iterating an ienumerable, if means a conditional statement, and } in json means the end of dictionary.

Using comments on parts of the code blocks inside a method indicates that the method could be composed of smaller ones with descriptive names and possibly add xmldoc comments:

    /// &lt;summary&gt;
    /// Appends multiline value &lt;paramref name="value"/&gt; with special formatting based on newline charactes.
    /// &lt;/summary&gt;
    /// &lt;param name="stringBuilder"&gt;Output builder.&lt;/param&gt;
    /// &lt;param name="value"&gt;&lt;/param&gt;
    public void AppendMultiline(StringBuilder stringBuilder, string value)
    {
        // ...
    }