I solved it with a nested list comprehension. Not sure you can get more succinct if that is your goal.
l = int(raw_input())
h = int(raw_input())
text_source = raw_input().upper() # put the upper() here to make the code below easier to read
ascii_rows = []
for d in xrange(h):
ascii_row = raw_input()
ascii_rows.append(ascii_row)
def indexascii_index(c):
# '[' comes after 'Z' in the ascii chart.
# ord('A') == 65, so this function returns a number
# that can be used as an index into the ascii_row strings.
return (ord('[') if c < 'A' or c > 'Z' else ord(c)) - 65
# No need for xrange(), just loop the data structures.
print("\n".join(["".join([ row[l*indexrow[l*ascii_index(c):l*(indexascii_index(c)+1)] for c in text_source.upper()]text_source]) for row in ascii_rows ]))