There are different approaches you can use but at a basic level you need somewhere for your site files to go (config/admin pages/css/js etc) and then also somewhere for your dlls to go and an nuspec file.
The structure we use is as follows:
Content - this should be structured in the same way as your Site root folder. e.g /app_config sub folder with other sub folders in it and config inside those. or /sitecore for any sitecore files.
lib - This should contain one or more sub folder for your site with the dotnet version (e.g net461) and then the dlls that are needed.
The nuspec config should look something like this and reference all the files required:
some info here about Template.Module
<file src="content\App_Config\Include\Template.Module\Template.Module.config" target="content\App_Config\Include\Template.Module\" exclude="" />
<file src="lib\net461\Template.Module.*" target="lib/net461" />
<file src="content\sitecore\admin\Template.Module\Template.Module.aspx" target="content\sitecore\admin\Template.Module\" exclude="" />
Some people also include an Sitecore package inside their nuget package of any Sitecore items of Serialized items to install into Sitecore along with the module. Some Marketplace modules also use this approach.
Bear in mind that if your following Helix principles you will want to structure your modules differently with feature/foundation layers etc. There are some posts on this here:
Sharing Sitecore content as a NuGet package
Creating a custom Sitecore NuGet package containing Unicorn files
You can then host these modules on an internal/private nuget feed if you wish to share them.
There are some github projects where people have already set up a skeleton you could use too:
See my answer here for some more info and links too: Sitecore deployment with new modules