New buildings isn't possible, but new units is if you are tricky about it. For the sake of example here is very brief idea to get you started:
Let's say I want to make Awesome Assault Ninjas and I want it to be high powered superinfantry. First thing to do is to add it in infantry.txt as another model, but take off the upgrade line from the previous one. Here's a brief example:
# Elite Infantry Division (1951) - 8
model = {
cost = 7
buildtime = 140
manpower = 10
maxspeed = 6
defaultorganisation = 30
morale = 30
defensiveness = 46
toughness = 38
softness = 100
suppression = 2
airdefence = 8
softattack = 26
hardattack = 9
airattack = 9
artillery_bombardment = 3
transportweight = 10
supplyconsumption = 1.2
fuelconsumption = 0
speed_cap_art = 7
speed_cap_eng = 7
speed_cap_at = 7
speed_cap_aa = 7
[note the missing lines here, I deleted them]
# Mah awesome assault ninjas - 8
model = {
cost = 20
buildtime = 200
manpower = 10
maxspeed = 12
defaultorganisation = 60
morale = 60
defensiveness = 60
toughness = 60
softness = 100
suppression = 6
airdefence = 60
softattack = 60
hardattack =60
airattack =60
artillery_bombardment =60
transportweight = 1
supplyconsumption = 0
fuelconsumption = 0
speed_cap_art = 60
speed_cap_eng = 60
speed_cap_at = 60
speed_cap_aa = 60
upgrade_time_factor = 0.5
upgrade_cost_factor = 1.0
Second, now add new unit namestring in doomsdaytext.csv for the new infantry model:
MODEL_0_8;Awesome Assault Ninjas;[in other languages + shit];X
Quite frankly you could add it in almost any .csv file AFAIK, but since inf '51 is stored there it's easier to keep it organised that way.
Third, add tech name entry in the tech file (infantry_tech.txt) with unused IDs. Let's use this one for example:
# Awesome assault ninjas
application =
{ id = 88880
name = TECH_APP_NINJAS_1_NAME
desc = TECH_APP_NINJAS_1_DESC
position = { x = 80 y = 80 }
year = 1954
# ?
component = { id = 88881 name = TECH_CMP_NINJAS_1_NAME type = general_equipment difficulty = 10 }
# ?
component = { id = 88882 name = TECH_CMP_NINJAS_2_NAME type = artillery difficulty = 10 }
# ?
component = { id = 88883 name = TECH_CMP_NINJAS_3_NAME type = electronics difficulty = 10}
# ?
component = { id = 88884 name = TECH_CMP_NINJAS_4_NAME type = rocketry difficulty = 10 }
# ?
component = { id = 88885 name = TECH_CMP_NINJAS_5_NAME type = training difficulty = 10 }
required = { 10000 }
effects =
{ command = { type = new_model which = infantry value = 8 }
}
Now let's add so it understands the strings in some .csv file:
TECH_APP_NINJAS_1_NAME;Awesome Assault Ninjas;[otherlanguages];;;X
TECH_APP_NINJAS_1_DESC;;;;;;;;;;;X
TECH_CMP_NINJAS_1_NAME;Advanced Ninja Weaponry;[youknowthedrill];;;X
TECH_CMP_NINJAS_2_NAME;Advanced Ninpo Magic;[youknowthedrill];;;X
TECH_CMP_NINJAS_3_NAME;Advanced Psychic Powersss[youknowthedrill];;;X
TECH_CMP_NINJAS_4_NAME;Advanced Ninja Gadgets;[youknowthedrill];;;X
TECH_CMP_NINJAS_5_NAME;Advanced Ninjutsu Training;[youknowthedrill];;;X
Presuming you did everything right you should now have new tab called Awesome Assault Ninjas in your infantry tab with correct string entries. Basically you just need to make a new 'model' of certain unit and tweak it the way you want, add string entries, model entries and such and then add custom icons, research photos and division illustration for the final mix. Making specific sheet to explain each unit (E.G. if you release a mod with tons of custom units) wouldn't hurt in case if they are event activated or using some specific unit as the base file.
As noted the example was done just by making nonsense unit with a new 'model' to which regular infantry doesn't ugprade. You could do bear cavalry given you do the correct steps + proceed to put the aesthetics right or almost anything else you would like to add.