Update
To allow string with multiple words separated by single space, and possible multiple instances of word and non empty intersection of positions:
mv[p_, sl_, m_] :=
Module[{d = Dimensions[m],
ms = Tuples[{-1, 0, 1}, 2] /. {0, 0} :> Sequence[],
ps, rule},
ps = If[
Or[Min[p + (sl - 1) #] <= 0, Min[d - (p + (sl - 1) #)] < 0], {},
Table[p + j #, {j, 0, sl - 1}]] & /@ ms;
rule = StringJoin[Extract[m, #]] -> # & /@ (ps /. {} -> Sequence[])
]
wf[str_, m_] := Module[{ss = StringSplit[str], fl, ru, find},
fl = {StringLength@#, Position[m, StringTake[#, 1]]} & /@ ss;
ru = Flatten[
Map[Function[u, Flatten[mv[#, u[[1]], m] & /@ u[[2]]]], fl]];
find = DeleteDuplicates@
Flatten[Map[Function[v, (v /. #) & /@ ru], ss] /.
Thread[ss :> Sequence[]], 2];
Grid[MapAt[Style[#, Red, Bold] &, m, find], Frame -> True,
Background -> LightGray]
]
So: wf["MATHEMATICA STACK EXCHANGE USERS", mat]

Original Answer
mv[p_, sl_, m_] :=
Module[{d = Dimensions[m],
ms = Tuples[{-1, 0, 1}, 2] /. {0, 0} :> Sequence[],
ps, rule},
ps = If[
Or[Min[p + (sl - 1) #] <= 0, Min[d - (p + (sl - 1) #)] < 0], {},
Table[p + j #, {j, 0, sl - 1}]] & /@ ms;
rule = StringJoin[Extract[m, #]] -> # & /@ (ps /. {} -> Sequence[])
]
fun[str_, m_] :=
Module[{dim = Dimensions[m], sl = StringLength[str], pos, cand, r,
find},
pos = Position[m, StringTake[str, 1]];
r = Flatten[mv[#, sl, m] & /@ pos];
find = str /. r;
If[find == str, find = {}];
Grid[MapAt[Style[#, Red, Bold] &, m, find], Frame -> True]
]
mv
searches grid only when string length possible
fun
returns result.
For example (note I had to remove spaces from copy and paste):
Using:
mat = {{"M", "S", "T", "A", "S", "I", "S", "X", "X", "T", "R", "X"},
{"A", "T", "H", "X", "R", "X ", "G", "R", "S", "H", "X", "A"},
{"M", "A", "T", "H", "E", "M", "A", "T", "I", "C", "A", "I"},
{"A", "X", "S", "G", "S", "X", "A", "I", "R", "T", "X", "T"},
{"T", "I", "T", "G", "U", "C", "C", "I", "R", "N", "X", "A"},
{"T", "A", "S", "X", "K", "G", "X", "H", "X", "A", "R", "C"},
{"H", "E", "R", "S", "I", "S", "G", "X", "A", "C", "E", "C"},
{"E", "H", "T", "H", "T", "I", "A", "T", "X", "N", "X", "X"},
{"S", "H", "H", "S", "R", "S", "X", "X", "S", "X", "G", "X"},
{"S", "G", "A", "S", "T", "A", "E", "G", "A", "G", "X", "E"}};
then
Column[fun[#, mat] & /@ {"MATHEMATICA", "STACK", "EXCHANGE"}]
yields:

and for "completeness":

Find
? Find out if the words are there are not? Find the positions in the lists of the letters in the words (if it is there)? ETc. $\endgroup$StringMatchQ[ StringJoin@Diagonal[listAll, 2], ___ ~~ "EXCHANGE" ~~ ___]
(Note you have a bunch of stray spaces in your input , by the way) $\endgroup$