The way this is usually done involves a (while) function reading the (grread) returned list. As long as that indicates that what has happened is movement of the cursor, [in this case] a Line can be drawn using (grdraw) or (grvecs) or (entmakex), so you can see what you're getting. And every time the cursor is moved again, that's deleted and a new one drawn based on the new cursor location. When (grread) finally indicates that a pick has been made, then it keeps the latest Line drawn.
A more sophisticated example, but one of the few times I've made full use of it, is RectMidPoint.lsp, >here<. It's repeatedly drawing a rectangle based around the specified midpoint, checking for the first entry in what (grread) returns to be a 5 for cursor movement, getting rid of the previous rectangle and drawing a new one, and when it's a 3 for a pick, it leaves the latest thing drawn.
Kent Cooper, AIA