There is absolutely no reason to use an intermediate variable to store output of commands just to perform a test or output that data.
#!/bin/sh -
if grep -q -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1"
then
echo 'Does not verify. Bad lines follow...'
grep -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1"
fi
The regular expression has been corrected to delete the extra + after {7}. The if statement tests the exit status of grep directly. The grep command in the if statement, and later, use -x to force a whole-line match, and the first grep statement uses -q to stop at the first match without outputting anything.
The actual issue in your code is using $result unquoted, which causes the shell to split the value on spaces, tabs, and newlines, and then do filename globing on the generated words. The final set of words are then given as arguments to echo which prints them with spaces as delimiters.
If you are concerned about running grep twice, then run it only once and store the output of it to e.g. a temporary file:
#!/bin/sh -
tmpfile=$(mktemp)
if grep -v -x -E -e '[A-Z]{7}[[:space:]]+[A-Z]{3}' -- "$1" >"$tmpfile"
then
echo 'Does not verify. Bad lines follow...'
cat -- "$tmpfile"
fi
rm -f -- "$tmpfile"