Of course any loop can be transformed in recursion, but reading an entire file a line at time, is, however, a typical iterative process, so I find this question difficult to motivate.
Here is a possible recursive version, where the recursion is managed by an internal function:
(defun load-file (filename)
(with-open-file (stream filename)
(labels ((read-recursively ()
(let ((line (read-line stream nil 'eof)))
(if (eq line 'eof)
nil
(cons line (read-recursively))))))
(read-recursively))))
This solution is prone to a stack-overflow error if the number of rows of the file is big.
If one has a compiler which can perform tail optimization, the following alternative recursive solution could be compiled in iterative fashion and could avoid the stack-overflow:
(defun load-file (filename)
(with-open-file (stream filename)
(labels ((read-recursively (read-so-far)
(let ((line (read-line stream nil 'eof)))
(if (eq line 'eof)
(reverse read-so-far)
(read-recursively (cons line read-so-far))))))
(read-recursively ()))))
tagbody;-)