In these cases, where the matter is to describe something (or someone), you can chose between être and avoir by the same mean as in English
Être assigns properties and avoir assigns possession. and there is an easy way to know which one you want:
Properties are expressed by adjectives and possessions by nouns.
To assign “un grand sourire” to il, you have to use avoir since sourire is a noun, thus
Il a un grand sourire
To assign “assez grand” to il, you have to use être since grand is an adjective, thus
Il est assez grand
Note that this is only a rule of thumb and by no mean a proper formal set of rules. If you want that, you have to realise that your question is actually confusing two different things
- A copula, that is, a way to assign relationships, membership, properties or positions to objects, expressed in French as in English and all Indo-European languages¹ via a so-called copular verb: to be, être. In programming, one would call this a IS_A
- A possession relationships, expressed in French as in English via a possessive verb: to have, avoir. In programming, one would call this an HAS_A.
So why “Il a un grand sourire”? Because body parts are considered to be possession, as are psychic features “Elle a un esprit vif” and lived years “J'ai dix ans”². I don't think³ it could be further rationalised without falling into the realm of speculative psychology (an individual has ownership of himself, blablabla) ; I would rather say that it is arbitrary.
By the way, “Il est un grand sourire” is grammatically and semantically correct, but means “he is nothing but a big smile”, est denoting here an equivalence.
¹ Yes, knowledgeable person, it has not the same importance and precise function in all IE languages.
² Je sais que c'est pas vrai.
³ But I would love to read serious linguistics rationalisations if someone has some.