I recently finished creating such a shader. The only way it can work is to provide 4 normal vectors instead of one for each vertex (smooth, sharp, and one for each edge of the triangle for a given vertex). You will also need one float3 to detect edges.
To add such data to the grid, I created a custom grid editor that comes with the Playtime Painter Asset from the Unity Asset Store. A shader will be published with the next update. Also will publish the publication of GitHub.

You can see some dark lines because it begins to interpolate onto a regular vector that is facing away from the light source, but since there are no additional triangles, the result is displayed on the triangle that faces the camera.
Update (2/12/2018) I realized that by cutting off the pixels, which ultimately have a normal back side from the camera, you can smooth out the outline shape. It has not been tested for all possible scenarios, but works great for simple forms: 
On request, a comparison cube was added: 
Currently, Playtime Painter has a simplified version of this shader that interpolates between two normal vectors and gives ok results on some edges.
Wrote an article .
source share