Why do we have negative length for character maximum length for geography and varchar(max) data types?
The value -1 is a special value that means "maximum currently supported". The maximum length of e.g. max, xml, and clr types could change in a future version of SQL Server.

In system views like INFORMATION_SCHEMA.COLUMNS the CHARACTER_MAXIMUM_LENGTH column already uses NULL for types where a character length is not applicable, for example the numeric types.

If you are currently using INFORMATION_SCHEMA views, you should read this and then consider using SQL Server's own metadata views like sys.columns instead.

As a side note, the underlying type of the max_length column in sys.columns is smallint NOT NULL. It is the maximum length (in bytes, not characters) of the column, or -1 meaning 'maximum supported` as mentioned before.