Label в данном случае это просто string, который вы отображаете в UI? То есть, каждое созданное поле будет иметь 2 "параметра" - label (то что отображается возле поля) и value (то, что ввели в поле)? Я тут вижу еще одно узкое место - когда вы доберетесь до полей других типов (number, radio, checkbox и тд), то у вас возникнут дополнительные "параметры" - тип поля и другие свойства. И вот тут все станет намного интереснее :)
Есть такой вариант - хранить в postmeta сразу 2 записи на одно поле:
fieldname => field value (значение)
fieldname_label => label value (лейбл)
Называть поля можно по разному. Например:
fieldname => value
_fieldname = label
В этом случае поле, которое начинается с подчеркивания, считается "скрытым" и "системным". Можно суффикс добавлять. Ну а дальше понадобится куча "подсистем", чтобы с этим удобно было работать.
А есть еще один вариант - хранить всю (любую) необходимую информацию в значении поля в виде сериализованного массива. Очевидный минус - по такому полю искать будет сложно (впрочем, внешнее индексирование с помощью того же Elastic Search проблему решит). В остальном - пихайте туда что хотите - значение поля, его лейбл, плейсхолдер, лимит символов и тд. Да хоть весь html целиком.