Displaying equations, how to combine strings and values without evaluating everything.

You can use ToString and StringJoin to "correct" your approach as in my comment above. Another possibility of displaying it without using strings (my preferred way) is:

Outer[HoldForm[#1 #2 ] == #1 #2 &, #, #] &@Range@9 // TableForm

Row is useful for building up expressions that mix strings and non-strings without converting everything to strings:

Table[Row[{i, "×", j, "=", i*j}], {i, 1, 9}, {j, 1, 9}]

multiplication table


StringForm[] is a very convenient function for the purpose:

Array[StringForm["`1`×`2`=`3`", #1, #2, #1 #2] &, {9, 9}] // TableForm

multiplication table