Is there a way for 2 parties to negotiate a shared secret (for example, a session key) without having a pre-shared knowledge?
SSL does this by using asymmetric encryption. Is there any other way to achieve this without use of PKI?
There is Diffie-Hellman (which SSL can also use), but this is only secure if an attacker cannot perform active attacks, or the parties can be mutually authenticated.
There are a number of key agreement protocols which are used to establish a shared secret, e.g. Diffie-Hellman. The real trouble is: a shared secret, yes, but with who ?
In the computer world, identity is knowledge. You want to share a secret with Bob but not with anybody posing as Bob: therefore, Bob must be able to "do something" that Charlie cannot; otherwise, you will not distinguish them reliably. Everybody has the same computers, so "being able to do something" equates to "knowing some confidential information".
With SSL, certificates are used, which means that there is asymmetric cryptography. Bob is distinct from Charlie (from your point of view) because Bob knows the private key corresponding to the public key which is in the certificate (and Charlie does not know that secret key).
To sum up: if you and Bob know a shared secret, then you can use that to authenticate to each other. Otherwise, if Bob knows a non-shared secret, then this secret is a private key in a public/private key pair; so the problem becomes: how do you know that the public key you are about to use is indeed Bob's ? PKI is a way to do that, with the help of an "authority" which performs the link between Bob's identity (which is not part of the computer world) and Bob's public key (which is in the computer world).
"PKI" is a wide term, and covers a degenerate situation, in which you are your own PKI. Namely, you meet Bob once, and he gives you his public key (or a hash thereof); afterwards, you use that knowledge to make sure that you are using the "right" Bob's key. This is how SSH works.