Display list with custom items in panel
Try using bpy.props.EnumProperty. Its items argument accepts a list, or a function that generates it from context data. For example, I could feed this function:

def get_enum_items(self, context):
    obj = context.active_object
    groups = obj.users_group
    group_names = [g.name for g in groups]
    return [(gn, gn, 'Instance group "%s"'%gn) for gn in group_names]


as item list generator to this property:

group = bpy.props.EnumProperty(
    name = "Group", items = get_enum_items,
    description = "Group to instance.")


so it will construct a list of groups the active object is contained in, on the fly (full code here). I think you can use this method for any named custom data.