Ciao, non saprei dirti qual'è il metodo più efficace, io generalmente (per il poco che ho fatto) lavoro nei layout, magari con degli include, cosa che mi permette di definire layout diversi per schermi diversi (o quantomeno differenziare portrait e landscape in maniera comoda).
Secondo me se non usi delle dimensioni fisse puoi riuscirci tranquillamente anche da codice, però io proverei a usare delle imageview o degli imagebutton se devo visualizzare delle immagini (più che altro perchè son fatti apposta per gestire delle immagini)
Per mappare 20 bottoni su un array di Button son 20 righe di codice non di più, vero è che invece la creazione di 20 bottoni potrebbe essere fatta su una funzione all'interno di un ciclo.