La logica della funzione è quasi giusta; l'errore sta nel fatto che scambi il nodo da inserire con la radice dell'albero, che è il parametro passato alla funzione.

codice:
#include <stdio.h>
#include <stdlib.h>

AlberoRicerca Insert(TipoElemento X, AlberoRicerca radice){
	//se l'albero è vuoto costruisco il nodoe lo
	//ritorno nodo come nuova radice dell'albero
	if(radice == null){
		//alloco il nodo da inserire
		struct NodoAlbero *nodo = malloc(sizeof(struct NodoAlbero));
		if(nodo == NULL){
			printf ("Errore di allocazione\n");
			return radice;
		}
		nodo -> Chiave = X;
		nodo -> Left = nodo -> Right = NULL;
		return nodo;
	}
	//altrimenti richiamo ricorsivamente la funzione
	if(X < radice -> Chiave)
		radice -> Left = Insert(X, radice -> Left);
	else
		radice -> Right = Insert (X, radice -> Right);
	return radice;
}
Inoltre nel main devi inzializzare a NULL l'albero:

AlberoRicerca albero = NULL;
albero = Insert(10, albero);