من از کلاس سفارشی هم برای این Collection استفاده کردم ولی  در این مورد حتی اجازه اضافه کردن آیتم به خصوصیت هم نمی دهد:
Imports System.ComponentModel
<Serializable(), TypeConverter(GetType(VariableCollectionConverter)  )> _
Public Class VariableCollection
    Inherits List(Of VariableItem)
    Overloads Sub Add(Name As String, Value As String)
        MyBase.Add(New VariableItem(Name, Value))
    End Sub
    Overloads Sub Add(Item As VariableItem)
        MyBase.Add(Item)
    End Sub
End Class
Imports System.Reflection
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Collections.Generic
Public Class VariableCollectionConverter
    Inherits TypeConverter
    Public Overrides Function ConvertFrom(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object) As Object
        If TypeOf (value) Is String Then
            Dim Coll As New VariableCollection
            Dim Expr As String = value
            Dim Items As String() = Expr.Split("/")
            Dim NV As String() = {}
            Dim v As VariableItem
            For Each Item As String In Items
                NV = Item.Split(":")
                v = New VariableItem(NV(0), NV(1))
                Coll.Add(v)
            Next
            Return Coll
     
        End If
        Return MyBase.ConvertFrom(context, culture, value)
    End Function
    Public Overrides Function ConvertTo(context As System.ComponentModel.ITypeDescriptorContext, culture As System.Globalization.CultureInfo, value As Object, destinationType As System.Type) As Object
        If destinationType Is GetType(String) Then
            Dim Expr As String = ""
            With DirectCast(value, VariableCollection)
                For i = 0 To .Count - 1
                    Expr += String.Format("{0}:{1}/", .Item(i).Name, .Item(i).Value)
                Next
            End With
            If Expr.Length = 0 Then Return Expr
            Return Expr.Remove(Expr.Length - 1, 1)
        ElseIf destinationType Is GetType(InstanceDescriptor) Then
            Dim ci As ConstructorInfo = GetType(VariableCollection).GetConstructor(New Type() {GetType(List(Of VariableItem))})
            Dim t As VariableCollection = CType(value, VariableCollection)
            Return New InstanceDescriptor(ci, t.ToArray)
        End If
        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function
    Public Overrides Function CanConvertTo(context As System.ComponentModel.ITypeDescriptorContext, destinationType As System.Type) As Boolean
        If destinationType Is GetType(String) Or destinationType Is GetType(InstanceDescriptor) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function
End Class