Your second example does what you are trying to do, and the answer is that no, make-environment doesn't add an implicit ground environment as parent. There are probably a number of reasons for this, but the most important one is that as it is the only environment constructor, it should be able to create completely empty environments (which are very useful btw).
Regarding your question about the difference between the two expressions, the first one "works" because the list you are constructing is not (cons 1 2) but actually (#primitive-applicative:cons 1 2). What I mean by that is that the list doesn't contain the symbol cons (which would be bound in the created environment) but the actual applicative cons. The "correct" way to do what you are trying to do is:
(eval ((unwrap list) cons 1 2) (make-environment))
or
($define! $quote ($vau (x) #ignore x))
(eval (list ($quote cons) 1 2) (make-environment))
This trips people every time when trying to understand the behaviour of applicatives, operatives and environments. The easiest way to be sure is to see (e.g. by using write or display) the list you are evaluating, and see if you have symbols or other objects in your list.
Regards,
Andres Navarro