The solution I arrived at was quite different to my initial ideas, so will document it here for archival purposes.
I built a form manager which allowed the addition of fields and multi-select fields (to be displayed as select lists, check-box lists etc. depending on user configuration.)
I allowed forms to be associated to roles, with fields shared across multiple forms as not to duplicate data.
This allowed me to simply pull out a form based upon role:
var form = formManager.Fetch(User.Username, Role.Name);
And loop through the form elements to generate the fields needed on user profile pages, the form manager being used to save updated data.