Вероятно, меня больше всего соблазнит:
create_record(Lst) ->
#blah{
attr1=proplists:get_value(attr1, Lst, default_attr1),
attr2=proplists:get_value(attr2, Lst, default_attr2),
...
}.
Смысл преобразования этой вещи в запись, вероятно, заключается в том, чтобы получить статическую проверку атрибутов во время компиляции в другом месте вашего кода, так что я не думаю, что есть какая-то опасность быть простой и немного повторяющейся.
Если вы хотите, магия record_info довольно проста, но помните, что record_info не является реальной функцией, поэтому эта функция не может быть универсальной. (Макрос может быть.)
make_record(Lst) ->
list_to_tuple([blah|[proplists:get_value(X, Lst) || X <- record_info(fields, blah)]]).
Если вы действительно хотите динамические ключи во время выполнения, используйте dict.