g | x | w | all
Bytes Lang Time Link
017Uiua250704T005814ZErikDaPa
010Japt250703T215257ZShaggy
013Vyxal 3250703T204322Zpacman25
251Python 3.5 using Numpy160516T110143ZR. Kap
108JavaScript ES6160305T213727Zedc65

Uiua, 17 bytes

⊡⊓◴⇌\+˜⊂↯⊣⊃⍆±⤚-∩⇌

Explanation:

⊡⊓◴⇌\+˜⊂↯⊣⊃⍆±⤚-∩⇌
               ∩⇌ => reverse both coordinates (due to Uiua's coordinate system)
          ⊃⍆±⤚-   => get both direction vector and distance
        ↯⊣        => direction vector repeated by amount of the distance
    \+˜⊂          => combine with the 1st coordinate, then do accumulative sum
   ⇌              => arrange grid for proper indexing
 ⊓◴               => remove duplicate coordinates
⊡                 => finally pick the coordinates from grid

Try this online!

Japt, 14 10 bytes

Takes the end coordinates as the first input, start coordinates as the second, and the grid, as a 2D array of characters, as the third. Outputs a character array.

íõV ÕËrgWz

Try it

íõV ÕËrgWz     :Implicit input of arrays U=end & V=start, and 2D-array W=wordsearch
í V            :Interleave U & V
 õ             :  Reduce each pair by reversed inclusive range (i.e., XõY=[Y,X])
    Õ          :Transpose
     Ë         :Map
      r        :  Reduce by
       g       :  Indexing
        Wz     :  With a starting value of W rotated 90° clockwise

Vyxal 3, 13 bytes

-∥±GY⁰pσV⎇⇄Þi

Vyxal It Online!

-1 because dip

-∥±GY⁰pσ$⇄T$Þi­⁡​‎‎⁡⁠⁡‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁢‏⁠‎⁡⁠⁣‏⁠‎⁡⁠⁤‏⁠‏​⁡⁠⁡‌⁣​‎⁠⁠⁠‎⁡⁠⁢⁡‏⁠‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁢⁢‏⁠‎⁡⁠⁢⁣‏⁠‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁣⁡‏⁠‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏⁠‎⁡⁠⁣⁤‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁤⁡‏⁠‎⁡⁠⁤⁢‏‏​⁡⁠⁡‌­
-               # ‎⁡difference between two coords
 ∥±G            # ‎⁢the direction vector of the difference and the maximum distance
    Y           # ‎⁣direction vector repeated that many times
     ⁰pσ        # ‎⁤prepend the initial coordinate and cumulative sum for coords of all letters
        $⇄T$    # ‎⁢⁡arrange the grid so indexing works properly
            Þi  # ‎⁢⁢get letter at coordinate
💎

Created with the help of Luminespire.

Python 3.5 using Numpy, 251 bytes:

def r(t,y,z):import numpy;l=numpy.array([[*i.split()]for i in z.split('\n')]);A,B,C,D=t[0],y[0],t[1],y[1];p=[1,-1];a=p[A>B];b=p[C>D];n=range(A,B+a,a);m=range(C,D+b,b);w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])];return w

Will golf more over time where and when I can.

Try It Online! (Ideone) (Here, input is taken such that the grid is surrounded with double quotes ("") and input on one line, with \ns between each line of the grid. Then, the points are provided in a simple tuple form, with the starting on the second line, and the end on the third.)

Ungolfed code along with Explanation

def r(t,y,z):
    import numpy
    l=numpy.array([[*i.split()]for i in z.split('\n')])
    A,B,C,D=t[0],y[0],t[1],y[1]
    p=[1,-1]
    a=p[A>B]
    b=p[C>D]
    n=range(A,B+a,a)
    m=range(C,D+b,b)
    w=[l[:,i][::-1][p]for i,p in zip([[A]*len(m),n][A!=B],[[C]*len(n),m][C!=D])]
    return w

For the purposes of this explanation, assume this program was run with the inputs ((0,4),(4,0)) and the first grid of the question. Here, I will go through the 2 main parts of the code:

After all that, the output, which is list w, is finally returned. In this case, that would be APPLE if called with print(''.join(r((0,4),(4,0),'''The Grid'''))) or ['A','P','P','L','E'] if it is called without ''.join(). Either way, it returns the correct answer, and we are done!

JavaScript (ES6) 108

(x,y,t,u,g)=>eval("for(g=g.split`\n`.reverse(),r=g[y][2*x];x-t|y-u;)r+=g[y+=u<y?-1:u>y][2*(x+=t<x?-1:t>x)]")

Less golfed

(x,y,t,u,g)=>{
    g=g.split`\n`.reverse();
    for(r = g[y][2*x]; x-t | y-u; )
        r+=g[y += u<y ? -1 : u>y][2*( x += t<x ? -1 : t>x)];
    return r
}