Names are a specialized field and I don’t have any resources on them.
The standard source for English given names is The Oxford Dictionary of English Christian Names by E.G. Withycombe. It is sadly out of print, and well worth grabbing if you find a copy.
As for the question at hand, and moving from the general to the specific, there are several Middle English patterns of nickname formation. The major ones were the addition of a fixed suffix, with -cock and -kin being the most common; shortening of the name through apocope or, less often, syncope; and rhyming, either of the original Christian name or of another nickname.
Put these together and you have the explanation for many English nicknames, as well as more than a few surnames. The -cock and -kin suffixes long since died out in nickname practice, but survive in surnames. So, for example, the surname “Wilcox” is a patronymic genitive of “Wilcock”, which in turn is a nickname form of “William”.
As for the specific question of “Bill” from “William,” this form is not attested from the Middle Ages. On the other hand, these forms were distinctly lower class, and it is possible that it existed without a record surviving. Also, there are a couple of surnames, e.g. “Bilson,” which suggest the nickname existed. On the gripping hand, there are other possible etymologies. So take your pick” either “Bill” is an old nickname for “William” which went under the radar for several centuries before surging into popularity, or it is a modern example (or imitation) of an old pattern in English.
