The documentation for the macro PUSH says:
push item place => new-place-value
Places are generalized references: variables, array slots, structure slots, CLOS object slots, and more. They are documented here: CLHS 5.1 Generalized Reference
What does generalized mean? In Common Lisp places are a concept which go beyond simple references like variables or slots. It is even user extensible -> one can defined new types of places.
NIL as a place
NIL (same as ()) is documented as a Constant Variable.
Thus something like this fails:
(setf nil 10)
(push 10 nil) is trying to push 10 to the place NIL.
CL-USER 1 > (macroexpand-1 '(push 10 nil))
(LET ((#:|new-value-1070| 10))
(LET* ((#:|Store-Var-1069| (CONS #:|new-value-1070| NIL)))
(SETQ NIL #:|Store-Var-1069|)))
There were have it: one tries to set NIL (as a reference, here a variable) to the value 10.
Since NIL is defined as a constant variable and constant variables are not to be changed, one can't push something to the place nil.
Thus NIL is not a useful place.
'NIL as a place
Why does (push 10 '()) fail? Which is the same as (push 10 'nil) and (push 10 (quote nil)).
Again, push expects a place. (quote ...) is not a defined place.
The default defined places are defined here: CLHS 5.1.2 Kinds of Places.
Which makes sense, since '() does not reference anything. Remember: places are generalized references. It is supposed to be a literal object ().
Function CONS
If we want to add a new object to a list, then we use cons:
CL-USER 4 > (cons 10 nil)
(10)
CL-USER 5 > (cons 10 'nil)
(10)
One than has to use the result list: store it somewhere, pass it to a function, ...