Read a crossword

Pyth - 11 10 8 7 bytes

saved one bytes thanks to @issacg.

t#cjsCB

Try it online here.

t#               Filter by if len > 1
 c               Chop by whitespace by default
  j              Join by newlines
   sCB           Input, implicit and its transpose in one list

CJam, 14 bytes

{_z+S*S%{,(},}

An unnamed block that expects a list of (padded) strings on top of the stack and leaves a list of words instead.

Test it here.

Explanation

_z    e# Duplicate and transpose the grid.
+     e# Append the transpose to the original grid.
S*    e# Join all lines by spaces to ensure that we don't get words 
      e# spanning multiple lines.
S%    e# Split around spaces, discarding empty segments.
{,(}, e# Filter: keep only those strings with length 2 or greater.

05AB1E, 9 bytes

ø«€#J˜ʒ¦Ā

Input as a character matrix.

Try it online or verify all test cases.

Explanation:

ø          # Zip/transpose the (implicit) input-matrix; swapping rows/columns
 «         # Merge this list of lists to the (implicit) input list of lists
  €        # For each inner list:
   #       #  Split them on spaces
    J      # Join each innermost list together to a single string
     ˜     # Flatten the entire list
      ʒ    # Filter the strings by:
       ¦   #  Remove the first character of the string (no-op if it's already empty)
        Ā  #  And check that it's non-empty
           # (after which the result is output implicitly)