Читаем что такое MVVM и async/await, создаем UserControl с версткой типа
<Grid>
<Image Source="{Binding Path=ViewModel.ImageSource, Mode=OneWay}"/>
<ProgressBar Value="{Binding Path=ViewModel.DownloadProgres, Mode=OneWay}"/>
</Grid>
Создаем ViewModel для контрола с нужными полями методом async Task Download().
теперь во ViewModel главного окна делаем метод принимающий массив Task, допустим startDownloadImage(params Task[] tasks) и выполняющий эти таски (await Task.WhenAll(tasks)).
В итоге получаем от каждой кнопки мы шлем таску от соответствующего UserControl`a, а если нужно все скачать то передаем все таски разом.
как то так, если не понятно то пиши