Retina, 112 109 99 94 91 bytes
^
.
+r`(?<!^\1+). (.+)
$'$0
.(?=.* (.+) (.+))(?=\1* |\2* )
o
o(\.*)o((\1\.*o)*) .*
O$1O$2
Not very competitive, I think, but number theory in Retina is always quite fun. :)
Takes input as unary numbers using . as the unary digit.
Try it online.
Explanation
...
[18:30:36] c_o_n_o_robrien: projecteuler.net/problem=15
[18:30:39] c_o_n_o_robrien: working on this
[18:32:01] Skarian : this is easy
[18:32:22] c_o_n_o_robrien: Mhm
[18:32:50] Skarian : 60 routes in a 20
[18:32:51] Skarian : grid