Writing something consecutively to the console is of very little value. OK,
primes returns a list of primes, but you really can't use them until all primes are calculated in the domain of
int, and that's a lot.
For instance, it is useless to write
primes  3 |> Seq.take 10 |> Seq.iter (printfn "%i")
because it will not return before all primes are calculated.
It is btw strange that the client of the
primes has to figure out that 2 is a prime :-):
primes  3 |> ignore
You could change the function to take a max or a count value to stop the generator when enough is enough.
As an alternative it is IMO more useful to return a
Seq of primes, because it returns the primes as soon as they are individually calculated:
let enumPrimes =
let rec primes currentNumber knownPrimes =
match isPrime currentNumber knownPrimes with
| true ->
yield! (primes (currentNumber + 2) (currentNumber::knownPrimes))
| false -> primes (currentNumber + 2) knownPrimes
yield!  |> primes 3
When determine if a number is a prime, it is only necessary to check primes up to (inclusive) the square root of the number:
let isPrime currentNumber knownPrimes =
let sqrtNum = sqrt (float currentNumber) |> int
knownPrimes |> List.rev |> List.takeWhile (fun p -> p <= sqrtNum) |> List.tryFind (fun p -> currentNumber % p = 0) = None