Thank you for the inspiration!
Iterators.product
did the trick.
Type stability is really not a problem in this case because all computations happen
behind additional function barriers.
This seems like a good solution:
pset = Dict(
param1 = [1,2],
param2 = 5,
param3 = [4,5])
map(vals -> Dict(keys(pset) .=> vals), Iterators.product(values(pset)...))[:]