See the question and my original answer on StackOverflow

I don't think this is possible directly from the property grid's code. However, you can use a TypeDelegator to trick the system and force it to use for example your DisplayName attribute in lieu of the type's Name property it uses by default.

1) create a custom TypeDelegator, like this:

class MyTypeDelegator : TypeDelegator
{
    public MyTypeDelegator(Type delegatingType)
        : base(delegatingType)
    {
    }

    public override string Name
    {
        get
        {
            var dna = (DisplayNameAttribute)typeImpl.GetCustomAttribute(typeof(DisplayNameAttribute));
            return dna != null ? dna.DisplayName : typeImpl.Name;
        }
    }
}

2) modify CreateNewItemTypes() like this:

    protected override Type[] CreateNewItemTypes()
    {
        return new Type[] { new MyTypeDelegator(typeof(Item1)), new MyTypeDelegator(typeof(Item2)) };
    }

Now, you should see the display names instead of the name in the menu.