The key difference is that Point<T> in struct Point<T> introduces a type variable, while in impl<T> Point<T> it’s being used, in the same way that you need to write
fn consume<T>(_: Point<T>) {}
You put the <..> bit after the name of the item being introduced. impls all have the same “name”, i.e., the empty string, so you just write it after the keyword.
Another key reason for defining paramters before using them in an impl is that it allows the following:
struct K<T, U> { .. }
impl<U, T: Trait<U>> K<T, U> {}
impl<T, U> K<Vec<(T, U)>, ()> {}
impl<'a, 'b: 'a, T> K<&'a T, &'b T> {}
Now, if you ask me, it would be nice to be able to write impl Type<Params..> for the “obvious” desugar, but this has a nasty ambiguity problem!
struct K<T> { .. }
impl K<T> {}
// desugar to
impl<T> K<T> {} //... right?
use foo::T;
impl K<T> {}
// does this still mean
impl<T> K<T> {}
// or
impl K<foo::T> {}
This sort of semantic change caused by use is unacceptable, imo.