OK got it. Lambda functions dont save their scope. Here is the right code:
list = ["a","b","c","d"]
fields = []
for entry in list:
fields += [Field(entry, type="string")]
db.define_table('test', *fields)
class MyVirtualFields(object):
pass
def get_func(value):
def func(self):
return getattr(self.test, value)
return fun
for entry in list:
setattr(MyVirtualFields, entry +"_", get_func(entry))
db.test.virtualfields.append(MyVirtualFields())

