Make widget with media upload repeatable

Naive repeatable are impossible with widgets as the data structure and UI tend to be rigid. On the face of it, the way you describe it in the question, you can just use the media library to select multiple images instead of one, and keep them as a list of attachment IDs. You should take a look at the core gallery image for inspiration.

If this is not good enough, the way to go is to separate between the UI and the DB storage of the widget data. Just following the same line of thought presented in the gallery widget, instead of having a field per repeatable data you group all the data into one hidden input field and create a JS that exctracts the data out of it when the widget form is displayed, and stores the data in it once there is a change.
(obviously if one storage “field” feels too restrictive, you can use more, the point is to have a constant number of them)