Okay, after further attempts, I seemed to have solved the issue by using ClienIDMode.Static on each generated Buttons and setting the IDs myself (using the path of the JSON nodes of the steps as ID).
Hopefully this will work in the long run.
But I still wonder if the original issue can be prevented somehow?